// 根路由配置
import Vue from 'vue'
import Router from 'vue-router'
import store from '../stores'
const moment = require('moment')
const lodash = require('lodash')
import backToLogin from '../services/backToLogin.service.js'
const {
  pageEnterTransitionClass,
  pageBackTransitionClass,
  loadingEnterTransitionClass,
  loadingBackTransitionClass
} = require('../services/transitionClass.service.js')
Vue.use(Router)

// 解决路由为空时的报错问题
const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err)
}

// 动态引入路由
const routes = []
const context = require.context('@/routers', true, /\/[\w]+\.(route).(js|ts)$/)
context.keys().forEach(filePath => {
  let route = context(filePath)
  routes.push(route[Object.keys(route)[0]])
})

const routers = new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    ...routes,

    // 根目录重定向到 /login
    {
      name: "index",
      path: '/',
      redirect: '/login'
    }
  ]
})

// 是否使用路由记录
const useRouterHistory = true
// 路由最大记录数
const routerHistoryMaxLength = 25
// 将路由记录到sessionStorage
const saveRoutersToSessionStorage = (routerType, info) => {
  let routerHistory = sessionStorage.getItem('routerHistory') ? JSON.parse(sessionStorage.getItem('routerHistory')) : []

  if (routerType == 'forward') {
    // 为前进时，记录一个路由记录
    let record = lodash.merge({}, info, {
      entryTime: moment(new Date()).format("YYYY-MM-DD HH:mm:ss"),
    })

    // 删除不需要的东西，解决 vConsole 因数据量太大而报错的问题
    delete record.hash
    delete record.matched
    delete record.params
    if (routerHistory.length >= routerHistoryMaxLength) {
      routerHistory.shift()
    }
    routerHistory.push(record)

    // 为后退时，删除最后一个路由记录
  } else if (routerType == 'back') {
    routerHistory.pop()
  }

  // 解决 JSON.stringify 报错问题
  let cache = [];
  let history = JSON.stringify(routerHistory, function (key, value) {
    if (typeof value === 'object' && value !== null) {
      // console.log(cache)
      if (cache.indexOf(value) !== -1) {
        // Circular reference found, discard key
        return;
      }
      // Store value in our collection
      cache.push(value);
    }
    return value;
  })
  cache = null;

  sessionStorage.setItem("routerHistory", history);
}

// 设置路由页面切换效果
// 判断前进还是后退
const changeTransition = (to) => {
  let routerHistory = sessionStorage.getItem('routerHistory') ? JSON.parse(sessionStorage.getItem('routerHistory')) : []

  const routerInfo = store.state.router_module.routerInfo // 路由信息
  const transitionInfo = store.state.router_module.transitionInfo // 切换信息

  // 两个后退标志
  let browserIsBack = false // 浏览器按了前进按钮还是后退按钮，默认为false（默认就是浏览器前进）
  let routerIsBack = transitionInfo.isBack // 是否按了左上角的后退按钮


  // 是否为浏览器后退
  if (useRouterHistory && (routerHistory.length >= 2 && to.path == routerHistory[routerHistory.length - 2].path)) {
    browserIsBack = true
  }

  // 判断标志 isBack 是否为 true
  // 判断是否按了浏览器后退按钮
  if (routerIsBack || browserIsBack) {
    store.commit('setTransitionInfo', {
      isBack: false, // 重置 isBack
      loadingTransitionClass: loadingBackTransitionClass,
      pageTransitionClass: pageBackTransitionClass
    })
    // 如果页面不是keepAlive，后退的时候则显示loading
    if (!routerInfo.keepAlive) {
      store.commit('setRouterInfo', {
        isLoading: true
      })
    }

    return 'back'
  } else {
    store.commit('setTransitionInfo', {
      loadingTransitionClass: loadingEnterTransitionClass,
      pageTransitionClass: pageEnterTransitionClass
    })

    store.commit('setRouterInfo', {
      isLoading: true
    })

    return 'forward'
  }
}

routers.beforeEach((to, from, next) => {
  console.log("【 路由 From 】：", from)
  console.log("【 路由 To 】：", to)

  // 判断路由是否存在
  if (to.name != null) {
    // 是否存在路由信息
    if (!lodash.isEmpty(to.meta)) {

      // 获取权限码
      let httpToken = localStorage.getItem('httpToken')

      const routerInfo = to.meta.routerInfo ? to.meta.routerInfo : {}
      // 修改路由属性 （to路由）
      store.commit('setRouterInfo', routerInfo)
      const routeStateInfo = store.state.router_module.routerInfo
      // 路由为“非公共路由” 且 没有权限码时 跳回鉴权页（一般为登录页）
      if (routeStateInfo.routerType == "private" && !httpToken) {
        // 跳转回登录页
        backToLogin()
      }

      // 设置路由页面切换效果
      let routerType = changeTransition(to)

      // 修改html标题，储存路由导航信息（meta）到 store （to路由）
      const navInfo = to.meta.navInfo ? to.meta.navInfo : {}
      store.commit('setNavInfo', navInfo)

      // 路由历史记录处理
      if (useRouterHistory) {
        let routerHistory = sessionStorage.getItem('routerHistory') ? JSON.parse(sessionStorage.getItem('routerHistory')) : []

        // 非首次进入
        if (window.isBrowserRefresh == 1) {
          // console.log("前端路由切换")
          saveRoutersToSessionStorage(routerType, to)
        } else {
          console.log("页面被刷新")
          // 判断刷新前是否已经存在路由记录
          if (routerHistory.length) {
            let route = routerHistory[routerHistory.length - 1]
            // 判断刷新前最后一个路由，与当前要进入的路由是否相同
            if (to.path != route.path && to.name != route.name) {
              console.log("路由不相同，可以记录，看业务情况")
            } else {
              console.log("路由相同，不记录")
            }
          } else {
            // 不存在路由的情况下
            saveRoutersToSessionStorage(routerType, to)
          }
        }
      }
    }

    next()
  } else {
    // 路由不存在时（用路由名称判断是否存在），跳转到 /not_found
    next({
      path: '/not_found',
      query: {}
    })
  }

  // 用于判断当前页面，浏览器是否刷新 详情看routers/index.js
  window.isBrowserRefresh = 1;

})

export default routers